% titlepage-demo.tex
\documentclass[xcolor=dvipsnames, aspectratio=169]{beamer}
\usepackage{xeCJK}
\setCJKmainfont{華康中黑體}
\usepackage{graphicx} 
\usepackage{listings}
\usepackage{color}

\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  frame=L,
  xleftmargin=\parindent,
  language=[x86masm]Assembler,
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{green!20!black},
  keywordstyle=\bfseries\color{green!40!black},
  identifierstyle=\color{blue},
  stringstyle=\color{orange},
}
\lstset{escapechar=@,style=customasm}
\usecolortheme[named=Brown]{structure}
\useoutertheme{infolines}
\usetheme{Berlin}

\logo{NTUST}
% items enclosed in square brackets are optional; explanation below
\title[MASM Introduction]{A short introduction of MASM}
\author{黃亮軒}
\institute{
  台灣科技大學\\
  National Taiwan University of Science and Technology\\
  黃亮軒
  \texttt{t1238142000@gmail.com}
}
\date{\today}
\setbeamertemplate{items}[ball]

\begin{document}

%--- the titlepage frame -------------------------%
\begin{frame}[plain]
	\titlepage
\end{frame}

\begin{frame}
	\tableofcontents
\end{frame}

%--- the presentation begins here ----------------%

\section{教學目的}

\begin{frame}{教學目的}
	\begin{itemize}
		\item 了解程式的底層運作
		\item 了解 Windows 程式的基本架構
		\item 了解如何與 OS 溝通
		\item 學會自己學會以上三點的延伸
	\end{itemize}
\end{frame}

\section{WinAsm 簡介}

\begin{frame}{First Blood}
	先打開 WinASM\\
	\includegraphics[height=150pt]{pic/01_01.png}
\end{frame}

\begin{frame}{Console}
	打開 C:/WinAsm/Samples/Console 的範例\\
	\includegraphics[height=150pt]{pic/01_04.png}
\end{frame}

\begin{frame}{Console}
	按 Shift+F8 組譯並執行\\
	\includegraphics[height=150pt]{pic/01_02.png}
\end{frame}

\begin{frame}[fragile]
\frametitle{程式講解 1 組語簡介}
	\begin{lstlisting}
Include Console.Inc ;引用 Console.Inc 標頭檔
mov eax, 1 ;將 1 移動到 eax
mov eax, 0DH ;將 13 移動到 eax

Invoke  atoi, offset inbuf ; 呼叫 atoi 函數將 inbuf 字串轉成數字
;上面一行呼叫等於下面三行
push    offset inbuf ; 將 inbuf 的位址推入 stack
call 	atoi	; 呼叫 atoi 函數
add     esp,4	; 把 stack 移回原來的位置
;cdecl 呼叫者將傳入參數由右而左塞入堆疊，且最後是由呼叫者負責將傳入參數移出堆疊。這是 C/C++ 函數使用的呼叫協定。因為清理堆疊的代碼必需附加在每次呼叫之後，所以產生出來的 binary code 會大於 stdcall 協定。好處是可以處理變動參數的函數 (如 atoi)。
	\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{程式講解 2 Console.asm}
	\begin{lstlisting}
; This is a sample Console program, author unknown.
; This program will request input for a string and print out the string reversed in upper case.

Include Console.Inc

.CODE

Start:

	Invoke Main ;call Main function
	Invoke ExitProcess,0 ;exit program

	\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{程式講解 3 Console.asm}
	\begin{lstlisting}
; define main function
Main Proc
	XOR EAX,EAX ; clear eax
	Get_Input Msg1, inbuf ; call Get_Input function
	Invoke ReverseText,Offset inbuf,Offset textbuf2 ; 反轉字串
	Invoke Ucase,Offset textbuf2 ; 將字串轉大寫
	;Invoke ClearScreen
	Print_Text Msg2		; 印出 Msg2 裡的字串
	Print_Text inbuf
	Print_Text Msg3
	Print_Text textbuf2
	Print_Text CRLF
	Get_Input Msg4,inbuf
	RET
Main EndP
	\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{程式講解 4 Console.inc}
	\begin{lstlisting}
.586 ; 指定機器

.MODEL flat, stdcall ; flat 32位元記憶體模式
; stdcall 預設使用 stdcall
;stdcall 呼叫者將傳入參數由右而左塞入堆疊，但最後是由被呼叫者負責將傳入參數移出堆疊。這是 Pascal 和一些 Windows Library 採用的呼叫協定。因為清理堆疊的代碼添加於被呼叫者之後，所以相較於 cdecl 協定來說可以產生出相對較小的 binary code。但是無法處理變動參數的函數 (如 printf)，因為被呼叫端無法預期到底有幾個傳入參數。
OPTION CASEMAP:NONE
; 加入 include 檔
Include windows.inc
Include kernel32.inc
Include masm32.inc
; 加入要連結的 lib
IncludeLib kernel32.lib
IncludeLib masm32.lib

	\end{lstlisting}
\end{frame}

\begin{frame}{視窗程式}
	開新專案，選擇 Dialog -> Demo\\
	\includegraphics[height=150pt]{pic/01_03.png}
\end{frame}

\end{document}
